home *** CD-ROM | disk | FTP | other *** search
Modula Implementation | 1997-10-26 | 8.6 KB | 311 lines |
- (*----------------------------------------------------------------------*
- * *
- * MAGICTOOLS Modula's All purpose GEM Interface Cadre Toolbox *
- * ÿ ÿ ÿ ÿ ÿ *
- *----------------------------------------------------------------------*
- * Version 3.30 02.02.1992 (C)90/91/92 by Peter Hellinger Software *
- *----------------------------------------------------------------------*
- * Dieses Modul ist urheberrechtlich geschtzt. *
- * *
- * Die Verffentlichung des Quelltextes oder Teilen daraus, sowie die *
- * Verbreitung des bersetzten, nicht gelinkten Codes in schriftlicher, *
- * oder maschinenlesbarer Form, insbesondere in Zeitschriften, Mail- *
- * boxen oder anderen Medien bedarf der ausdrcklichen schriftlichen *
- * Einverstndnisserklrung des Autors. *
- * *
- * Die Verbreitung des Moduls als Teil eines gelinkten Programms ist *
- * fr Lizenznehmer ausdrcklich erlaubt! Der Autor behlt sich das *
- * Recht vor, diese Erlaubnis jederzeit und ohne Angaben von Grnden zu *
- * widerrufen. *
- *----------------------------------------------------------------------*)
-
- IMPLEMENTATION MODULE mtTrees;
-
- (*----------------------------------------------------------------------*
- * Int. Vers | Datum | Name | nderung *
- *-----------+----------+------+----------------------------------------*
- * 3.00 | 18.01.92 | Hp | *
- *-----------+----------+------+----------------------------------------*)
-
-
-
- (* IMPLEMENTATION FR >>> Megamax-Modula-2 <<< *)
- (* *)
- (*$R- Range-Checks *)
- (*$S- Stack-Check *)
- (* *)
- (*----------------------------------------------*)
-
-
-
-
-
-
- FROM MagicSys IMPORT Nil, Null, Bit0, Bit1, Bit2, Bit3, Bit4, Bit5, Bit6,
- Bit7, Bit8, Bit9, Bit10, Bit11, Bit12, Bit13, Bit14,
- Bit15, LOC, Byte, ByteSet, sWORD, sINTEGER, sCARDINAL,
- sBITSET, lINTEGER, lCARDINAL, lWORD, lBITSET,
- CastToChar, CastToByte, CastToByteset, CastToInt,
- CastToCard, CastToBitset, CastToWord, CastToLInt,
- CastToLCard, CastToLBitset, CastToLWord, CastToAddr,
- TosVersion, Accessory, Basepage, SysHeader, TosDate;
-
-
-
-
-
-
-
-
- FROM Storage IMPORT ALLOCATE, DEALLOCATE;
-
-
-
-
- FROM SYSTEM IMPORT ADDRESS, ADR, TSIZE;
-
- CONST cMax = 07FFFH;
-
- TYPE INFO = POINTER TO ARRAY [0..cMax] OF LOC;
-
- TYPE NODE = POINTER TO Node;
- Node = RECORD
- addr: INFO;
- size: sCARDINAL;
- left: NODE;
- right: NODE;
- back: NODE;
- END;
-
- TYPE TREE = POINTER TO Tree;
- Tree = RECORD
- root: NODE;
- comp: CompProc;
- entry: lCARDINAL;
- END;
-
- PROCEDURE Copy (from, to: INFO; size: CARDINAL);
- VAR c: CARDINAL;
- BEGIN
- FOR c:= 0 TO size DO to^[c]:= from^[c]; END;
- END Copy;
-
- PROCEDURE NewTree (VAR tree: TREE; comp: CompProc): BOOLEAN;
- BEGIN
- ALLOCATE (tree, TSIZE (Tree));
- IF tree = NIL THEN RETURN FALSE; END;
- tree^.root:= NIL; tree^.comp:= comp; tree^.entry:= LONG (0);
- RETURN TRUE;
- END NewTree;
-
- PROCEDURE DisposeTree (VAR tree: TREE);
- VAR p: NODE;
- BEGIN
- IF tree # NIL THEN
- WITH tree^ DO
- (* Wieso steht hier eigentlich nichts? *)
- END;
- DEALLOCATE (tree, 0);
- END;
- END DisposeTree;
-
- PROCEDURE TreeEntries (tree: TREE): lCARDINAL;
- BEGIN
- IF tree = NIL THEN RETURN LONG (0);
- ELSE RETURN tree^.entry;
- END;
- END TreeEntries;
-
- PROCEDURE NilNode (): NODE;
- BEGIN
- RETURN NIL;
- END NilNode;
-
- PROCEDURE InsertNode (tree: TREE; info: ARRAY OF LOC): BOOLEAN;
- VAR p, q, n: NODE;
- cmp: CompResult;
- dir: (l, r);
-
- PROCEDURE NewNode (): NODE;
- VAR t: NODE;
- BEGIN
- ALLOCATE (t, TSIZE (Node));
- IF t = NIL THEN RETURN NIL; END;
- t^.size:= HIGH (info);
- t^.left:= NIL; t^.right:= NIL; t^.back:= NIL;
- ALLOCATE (t^.addr, LONG (t^.size));
- IF t^.addr = NIL THEN DEALLOCATE (t, 0); RETURN NIL; END;
- Copy (ADR(info), t^.addr, t^.size);
- RETURN t;
- END NewNode;
-
- BEGIN
- IF tree = NIL THEN RETURN FALSE; END;
- n:= NewNode ();
- IF n = NIL THEN RETURN FALSE; END;
- WITH tree^ DO
- p:= root; q:= p;
- WHILE p # NIL DO
- q:= p;
- cmp:= comp (n^.addr, p^.addr);
- CASE cmp OF
- smaller: dir:= l; p:= p^.left;|
- bigger: dir:= r; p:= p^.right;|
- ELSE RETURN FALSE; (* Element existiert bereits! *)
- END;
- END; (* WHILE *)
- n^.back:= q;
- IF q # NIL THEN
- IF dir = l THEN q^.left:= n; ELSE q^.right:= n; END;
- ELSE
- root:= n;
- END;
- END;
- INC (tree^.entry);
- RETURN TRUE;
- END InsertNode;
-
- PROCEDURE SearchNode (tree: TREE; from: NODE; info: ARRAY OF LOC;
- key: CompProc): NODE;
- VAR ok: BOOLEAN;
- cmp: CompResult;
- p, q: NODE;
- BEGIN
- IF tree = NIL THEN RETURN NIL; END;
- WITH tree^ DO
- p:= root; q:= root; ok:= FALSE;
- IF from # NIL THEN p:= from; q:= from;
- ELSE p:= root; q:= root;
- END;
- WHILE p # NIL DO
- q:= p;
- cmp:= key (ADR (info), p^.addr);
- CASE cmp OF
- equal: RETURN p;|
- smaller: p:= p^.left;|
- bigger: p:= p^.right;|
- END;
- END; (* WHILE *)
- END; (* WITH *)
- RETURN NIL;
- END SearchNode;
-
- PROCEDURE DeleteNode (tree: TREE; VAR node: NODE);
- VAR q, p, t: NODE;
- inf: INFO;
-
- PROCEDURE Del (VAR x: NODE);
- BEGIN
- DEALLOCATE (x^.addr, 0);
- DEALLOCATE (x, 0);
- x:= NIL;
- END Del;
-
- PROCEDURE Putback (VAR x: NODE; y: NODE);
- BEGIN
- IF x^.back # NIL THEN
- WITH x^.back^ DO
- IF left = x THEN left:= y; ELSE right:= y; END;
- END;
- END;
- IF y # NIL THEN y^.back:= x^.back; END;
- END Putback;
-
- BEGIN
- IF (tree = NIL) OR (node = NIL) THEN RETURN; END;
- WITH tree^ DO
- IF node^.left # NIL THEN
- p:= node; q:= NIL;
- WHILE p # NIL DO q:= p; p:= p^.right; END;
- t:= q^.left;
- ELSIF node^.right # NIL THEN
- p:= node; q:= NIL;
- WHILE p # NIL DO q:= p; p:= p^.left; END;
- t:= q^.right;
- ELSE
- q:= node; t:= NIL;
- END;
- IF node = q THEN
- IF node = root THEN Del (root);
- ELSE Putback (node, NIL); Del (node);
- END;
- ELSE
- Putback (q, t);
- inf:= node^.addr; node^.addr:= q^.addr; q^.addr:= inf;
- Del (q);
- END;
- END;
- DEC (tree^.entry);
- END DeleteNode;
-
- PROCEDURE FirstNode (tree: TREE): NODE;
- VAR p, q: NODE;
- BEGIN
- IF tree = NIL THEN RETURN NIL; END;
- p:= tree^.root; q:= NIL;
- WHILE p # NIL DO q:= p; p:= p^.left; END;
- RETURN q;
- END FirstNode;
-
- PROCEDURE LastNode (tree: TREE): NODE;
- VAR p, q: NODE;
- BEGIN
- IF tree = NIL THEN RETURN NIL; END;
- p:= tree^.root; q:= NIL;
- WHILE p # NIL DO q:= p; p:= p^.right; END;
- RETURN q;
- END LastNode;
-
- PROCEDURE NextNode (node: NODE): NODE;
- VAR p, q: NODE;
- ok: BOOLEAN;
- BEGIN
- IF node = NIL THEN RETURN NIL; END;
- IF node^.right # NIL THEN
- p:= node^.right; q:= NIL;
- WHILE p # NIL DO q:= p; p:= p^.left; END;
- RETURN q;
- ELSE
- ok:= FALSE; p:= node;
- REPEAT
- q:= p; p:= p^.back;
- IF p = NIL THEN ok:= TRUE;
- ELSE ok:= p^.left = q;
- END;
- UNTIL ok;
- RETURN p;
- END;
- END NextNode;
-
- PROCEDURE PrevNode (node: NODE): NODE;
- VAR ok: BOOLEAN;
- p, q: NODE;
- BEGIN
- IF node = NIL THEN RETURN NIL; END;
- IF node^.left # NIL THEN
- p:= node^.left; q:= NIL;
- WHILE p # NIL DO q:= p; p:= p^.right; END;
- RETURN q;
- ELSE
- ok:= FALSE; p:= node;
- REPEAT
- q:= p; p:= p^.back;
- IF p = NIL THEN ok:= TRUE;
- ELSE ok:= p^.right = q;
- END;
- UNTIL ok;
- RETURN p;
- END;
- END PrevNode;
-
- PROCEDURE GetNode (node: NODE; VAR info: ARRAY OF LOC): BOOLEAN;
- BEGIN
- IF node = NIL THEN RETURN FALSE; END;
- IF HIGH (info) < node^.size THEN RETURN FALSE; END;
- Copy (node^.addr, ADR(info), node^.size);
- RETURN TRUE;
- END GetNode;
-
- END mtTrees.
-
-